home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / FuncEnemy / BOSS_M01.C < prev    next >
Text File  |  2000-03-21  |  5KB  |  193 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.h>
  4. */
  5. /* 直進、レーザー、退却 */
  6. #include <xsp2lib.h>
  7. #include "../SPASSION.H"
  8. #include "../player.h"
  9. #include "../enemy.h"
  10. #include "../eshot.h"
  11. #include "../effect.h"
  12. #include "../priority.h"
  13. #include "../sound.h"
  14. #include "../entry.h"
  15. #include "../SUB.H"
  16. #ifndef NULL
  17. #define NULL ((void *) 0)
  18. #endif
  19.  
  20. #define P_X    (*((short *) (&player[0].lx)))    /*lxの上位ワード*/
  21. #define P_Y    (*((short *) (&player[0].ly)))    /*lyの上位ワード*/
  22.  
  23. #define PALET_MAIN    0x0500
  24.  
  25. extern short    obj_boss_m01;
  26. short enemy_explode( ENEMY *ene );
  27. static short MoveEnemyBossM01(ENEMY *);
  28. /*static void TiniEnemyBossM01(ENEMY *);*/
  29.  
  30. static HIT_XY4    hit_p[]={-10-PLAYER_HIT_X,-10-PLAYER_HIT_Y,10+PLAYER_HIT_X,10+PLAYER_HIT_Y};
  31. static HIT_XY4    hit_o[]={-10-OPTION_HIT_X,-10-OPTION_HIT_Y,10+OPTION_HIT_X,10+OPTION_HIT_Y};
  32. static HIT_XY4    hit_s[]={-10,-10,10,10};
  33.  
  34. void InitEnemyBossM01Hit( void )
  35. {
  36. }
  37.  
  38. void InitEnemyBossM01(ENEMY *ene)
  39. {
  40.     ene->angle         = 192;
  41.     ene->vx             = vx_tbl[15][192];
  42.     ene->vy             = vy_tbl[15][192];
  43.     ene->pt             = obj_boss_m01 + ((ene->angle) >> 3);
  44.     ene->info         = PALET_MAIN | PRIORITY_ZAKO;
  45.     ene->hit_p[0]     = &hit_p[0];ene->hit_p[1]=NULL;
  46.     ene->hit_o[0]     = &hit_o[0];ene->hit_o[1]=NULL;
  47.     ene->hit_s[0]     = &hit_s[0];ene->hit_s[1]=NULL;
  48.     ene->hp             = 20;
  49.     ene->no_dead     = 0;
  50.     ene->func_enemy_move = MoveEnemyBossM01;
  51. /*    ene->func_enemy_tini = TiniEnemyBossM01;*/
  52. }
  53.  
  54.  
  55. static short MoveEnemyBossM01( ENEMY *ene )
  56. {
  57.     unsigned char angle;
  58.     short Wait( ENEMY *ene, short time );
  59.  
  60.     /* 爆発して2秒後に消す(レーザーが画面の外に出るのを待つ) */
  61.     if( ene->dead_count ){
  62.         if( ene->dead_count++ > 120 )
  63.             return (0);        /* 消去 */
  64.         else
  65.             return (1);
  66.     }
  67.  
  68.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  69.     ene->x = (ene->lx += ene->vx) >> 16;
  70.     ene->y = (ene->ly += ene->vy) >> 16;
  71.     ene->vx=vx_tbl[15][ene->angle];
  72.     ene->vy=vy_tbl[15][ene->angle];
  73.  
  74.     switch (ene->state){
  75.     case 0:
  76.         /* 折り返す */
  77.         if( ENE_X < 192 ){
  78.             if( ene->arg != 2 ){
  79.                 if( ENE_Y < 128+16 )
  80.                     ene->arg=1;
  81.                 else
  82.                     ene->arg=0;
  83.             }
  84.             ene->state++;
  85.         }
  86.         break;
  87.     case 1:
  88.         ene->vx=ene->vy=0;
  89.         if( !Wait( ene, 120 ) ){
  90.             if( ene->count==20 ){
  91.                 ESHOT    *eshot;
  92.                 switch ( level ){
  93.                 case EASY:
  94.                     /* レーザー */
  95.                     eshot=MakeEShot(ESHOT_LASER01, ENE_X, ENE_Y, 5, 128, 4,0,ene);
  96.                     eshot->box_x=-16-16;eshot->box_y=-16;
  97.                     SetSE(SE_LASER01);    /* 敵ショット音 */
  98.                     break;
  99.                 case NOMAL:
  100.                     /* 太いレーザー */
  101.                     eshot=MakeEShot(ESHOT_LASEREX, ENE_Y, ENE_Y, 5, 128, 4,0,ene);
  102.                     eshot->box_x=-16-16;eshot->box_y=-16;
  103.                     SetSE(SE_EXLASER);    /* 敵ショット音 */
  104.                     break;
  105.                 case HARD:
  106.                     /* 太いレーザー */
  107.                     eshot=MakeEShot(ESHOT_LASEREX, ENE_Y, ENE_Y, 5, 128, 4,0,ene);
  108.                     eshot->box_x=-16-16;eshot->box_y=-16;
  109.                     MakeEShot(ESHOT_ENG02, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
  110.                     MakeEShot(ESHOT_ENG02, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
  111.                     MakeEShot(ESHOT_ENG02, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
  112.                     SetSE(SE_EXLASER);    /* 敵ショット音 */
  113.                     break;
  114.                 }
  115.             }
  116.         }else
  117.             ene->state++;
  118.         break;
  119.     case 2:
  120.         if( ene->arg!=2 ){
  121.             if( ene->arg )
  122.                 ene->angle-=2;
  123.             else
  124.                 ene->angle+=2;
  125.  
  126.             ene->angle&=255;
  127.             ene->pt   = obj_boss_m01 + ((ene->angle) >> 3);
  128.             ene->info = PALET_MAIN | PRIORITY_ZAKO;
  129.             if( ene->angle == 64 )
  130.                 ene->state++;
  131.         }else
  132.             ene->state++;
  133.     case 3:
  134.         /* 画面外に出たら消去 */
  135.         if( ENE_X < 0 +16+16 || ENE_X > 256 + 32 )
  136.             ene->dead_count=1;
  137.     }
  138.  
  139.     /* ダメージを受けた時の処理 */
  140. #if 1
  141.     if(ene->damage){
  142.         SetSE(SE_DAMAGE);    /* 効果音 */
  143.         ene->info = PALET_DAMAGE | PRIORITY_BOSS;    /*パレット変更*/
  144.         /* 破壊された */
  145.         if((ene->hp -= ene->damage) <= 0) {
  146.             MakeEffect(EFFECT_EXPL, 0, ene->x, ene->y);
  147.             SetSE(SE_EXPL_MBOSS);    /* 爆発音 */
  148.             if(disp_level == DISP_LEVEL_HIGH)
  149.                 MakeEffect (EFFECT_HAHENMINI, 0, ene->x, ene->y);
  150.             if(!eshot_erase)
  151.                 eshot_erase = ESHOT_ERASE;    /* 弾消し */
  152.             ene->player->score += 3;
  153.             ene->dead_count=1;
  154.             ene->hit_p[0]=NULL;
  155.         }
  156.         ene->damage = 0;
  157.     }else
  158.         ene->info = PALET_MAIN | PRIORITY_ZAKO;
  159.  
  160. #endif
  161. #if 0
  162.     if(ENE_X < 128){
  163.         ene->lx = 127*65536;
  164.         ene->ly = 224*65536;
  165.         ene->vx = 0;
  166.         ene->vy = 0;
  167.         if( BITSNS(0x04) & BIT(1) ){        /* F */
  168.             while( BITSNS(0x04) & BIT(1) );
  169.             entry_counter_stop = 0;
  170.             return (0);
  171.         }
  172.         ene->angle++;
  173.         ene->angle&=255;
  174.         ene->pt   = obj_boss_m01 + ((ene->angle) >> 3);
  175.         ene->info = PALET_MAIN | PRIORITY_ZAKO;
  176.     }
  177. #endif
  178. /*    ene->hit_p[0] = &hit_p[ene->anim_count];
  179.     ene->hit_o[0] = &hit_o[ene->anim_count];
  180.     ene->hit_s[0] = &hit_s[ene->anim_count];
  181. */
  182.     xobj_set_st(ene);
  183.  
  184.     return(1);
  185. }
  186.  
  187. /*
  188. static void TiniEnemyBossM01(ENEMY * p)
  189. {
  190.     entry_control -= ENTRY_CONTROL_ADD;
  191. }
  192. */
  193.